<?php
/**
 * shMoteur est la classe déléguée faisant le lien entre chaque
 * brique de l'application. Elle analyse les requêtes et répartie
 * les tâches en fonction.
 *
 * @category librairies
 * @package sh
 *
 * @author Mickaël CASTANHEIRO
 * @version 1.0
 */
class shMoteur extends shBase {
    /**
     * @access private
     * @var shMoteur
     */
    private static $instance;


    /**
     * @access protected
     * @var string
     */
    protected $title;

    /**
     * @access protected
     * @var array
     */
    protected $arianes;

    /**
     * Stylesheets complémentaires
     * @access protected
     * @var array
     */
    protected $stylesheets;

    /**
     * Javascripts complémentaires
     * @access protected
     * @var array
     */
    protected $javascripts;

    /**
     * @access protected
     * @var array
     */
    protected $datas;


    /**
     * Accès au singleton de la classe
     *
     * Génère le singleton de la classe si cela n'a pas été fait.
     * Retourne simplement l'instance unique sinon
     *
     * @return <shMoteur> Instance unique de la classe
     */
    public function __instance() {
        if ( !(self::$instance instanceof shMoteur) )
            self::$instance = new shMoteur;
        return self::$instance;
    }


    /**
     * Constructeur de la classe
     *
     * @access private
     * @return shMoteur Instance crée
     */
    private function __construct() {
        // Ouvre la session
	session_start();

	// Délègue le chargement des fichiers
        spl_autoload_register(array('shMoteur', '__autoload'));

        // Données relatives à l'environnement
        $this->datas = array();
        $this->arianes = array();
	$this->stylesheets = array();
	$this->javascripts = array();
    }

    /**
     * Autload récurrent des classes
     * @access private
     */
    private static function recurrentAutoload($_className, $_directory) {
        if ( file_exists($_directory.$_className.'.class.php') ) {
            require_once $_directory.$_className.'.class.php';
            return true;
        }

        // Regarde s'il existe des répertoires dans ce répertoire
        else {
            $files = scandir($_directory);
            foreach($files AS $file) {
                if ( is_dir($_directory.$file.'/') AND ($file != '.') AND ($file != '..') ) {
                    self::recurrentAutoload($_className, $_directory.$file.'/');
                }
            }
        }
    }


    /**
     * Autoload des classes
     * @access private
     */
    private static function __autoload($_className) {
        self::recurrentAutoload($_className, DIR_CLASSES);
    }


    /**
     * Execute la requête demandée
     */
    public function execute() {
        // Fait appel au couple module/action demandé
        shAction::load();
        // Fait appel au template du couple module/action demandé
        shTemplate::load();
    }
}
?>